package net.ojbk.service;

import net.ojbk.dao.ActivationDataDao; // Dao
import net.ojbk.dao.UserDataDao; // Dao
import net.ojbk.dao.UserLoginDao; // Dao
import net.ojbk.po.ActivationData; // po
import net.ojbk.po.Email;
import net.ojbk.po.UserData;
import net.ojbk.po.UserLogin;
import net.ojbk.util.EmailTool; // util
import net.ojbk.util.PasswordTool;
import net.ojbk.util.StringTool; // util
import net.ojbk.util.DateTool;

/**
 * 实现用户的激活
 * 
 * 更新 ActivationData code 属性为 成功
 * 增加 UserLogin 一条记录
 * 增加 User 一条记录
 * 
 * @author twobox
 *
 */
public class ActivationService {
	ActivationDataDao activationDataDao;
	UserLoginDao userLoginDao;
	UserDataDao userDataDao;
	String urlhead = "http://ojbk.net:8080/shiyi_ojbk/home/ActivationServlet";
	
	
	public ActivationService() {
		activationDataDao = new ActivationDataDao();
		userLoginDao = new UserLoginDao();
		userDataDao = new UserDataDao();
	}
	
	/**
	 * 注册 Service
	 * 
	 * @param activData 激活信息
	 * @return  1：成功		2：密码不符合要求		3：Email已被注册
	 */
	public int register(String userEmail, String password) { // 注册 Service
		// 初始化一下
		ActivationData activData = new ActivationData();
		activData.setPassword(password);
		activData.setEmail(userEmail);
		
		String code;
		// 判断邮箱是否已存在 、密码是否不符合要求
		activationDataDao.queryOneRecord(activData);
		if (activData.getCode() != null ) return 3; // Email 已被注册
		if (!PasswordTool.checkPassword(password)) return 2; // 密码不符合要求
		
		// 生成 code
		do {
			code = StringTool.getRandomString(43);
		} while(checkCode(code));
		System.out.println("Code: " + code);
		
		// 设置Code 写入数据库
		activData.setCode(code);
		activationDataDao.addOneRecord(activData);
		
		// 发送验证邮件
		Email email = new Email();
		email.setToEmail(userEmail);
		email.setTitle("师易信息科技有限公司 账户激活邮件");
		email.setContent("URL:"
				+ urlhead
				+ "?code="
				+ code
				+ "");
		EmailTool.sendEmail(email);

		return 1;
	}
	
	/**
	 * 激活账户
	 * 
	 * @param activData
	 * @return 1：成功		2：code错误或已激活
	 */
	public int activation(String code) { // 激活 Service
		// 判断该 code 是否存在
		if (code == null || code.equals("1") || !checkCode(code)) return 2;
		
		// 如果存在 分配 新ID
		String newID;
		do {
			newID = StringTool.getRandomNumberString(5);
		} while (userDataDao.checkOneRecord(newID));
		
		// 获取原预设置密码 与邮箱
		String password;
		String email;
		ActivationData ad = new ActivationData();
		ad.setCode(code);
		activationDataDao.queryOneRecord(ad);
		password = ad.getPassword();
		email = ad.getEmail();
		
		
		
		// 配置记录对象 并 写入数据库
		UserLogin ul = new UserLogin();
		ul.setPassword(password);
		ul.setId(newID);
		
		UserData ud = new UserData();
		ud.setEmail(email);
		ud.setId(newID);
		ud.setRegistrationTime(DateTool.getDateTime());
		
		userLoginDao.addOneRecord(ul);
		userDataDao.addOneRecord(ud);
		
		// 更新状态为已激活
		ad.setCode("1"); // 1 已激活
		activationDataDao.updateOneRecord(ad);
		
		// 发送验证成功的邮件
		Email e = new Email();
		e.setTitle("师易信息科技有限公司 成功激活邮件");
		e.setToEmail(email);
		e.setContent("成功激活，请保管好自己的帐户密码"
				+ "\nID：" + newID
				+ "\nKEY：" + password
				+ "");
		EmailTool.sendEmail(e);
		return 1;
	}
	
	private boolean checkCode(String code) { // 检测 Code 是否已存在
		ActivationData acData = new ActivationData();
		acData.setCode(code);
		activationDataDao.queryOneRecord(acData);
		if (acData.getEmail() == null)
			return false;
		return true;
	}
	
	public static void main(String[]  args) { // testing ...
//		String email = "200562421@qq.com";
//		String password = "123456";
//		String code = "2";
		
//		ActivationDataDao acDataDao = new ActivationDataDao();
//		acDataDao.deleteOneRecord(activaData);
		
//		System.out.println(new ActivationService().activation(code));
		
	}
}
